package com.ajin.hot100;

public class Code4 {
    /**
     * 移动零
     * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
     * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
     * 示例 1:
     * 输入: nums = [0,1,0,3,12]
     * 输出: [1,3,12,0,0]
     * 示例 2:
     * 输入: nums = [0]
     * 输出: [0]
     *
     * @param nums
     */
    public void moveZeroes(int[] nums) {
        //1.定义一个变量为头指针，碰到不为0的元素就插入并递增
        int insertPos = 0;
        for(int num : nums){
            if( num!=0){
                nums[insertPos++] = num;
            }
        }
        //2.如果有0出现则补0，指针的位置到末尾补0
        while (insertPos<nums.length){
            nums[insertPos++]= 0;
        }
    }

    public void moveZeroes2(int[] nums) {
        //0.效率低，暴力解法
        //1.定义两个遍历一个头部，一个尾部（数组长度)
        int end = nums.length;
        //2.找到值为0的下标，然后移动到尾部,其余元素前移
        for (int i = 0; i < end; i++) {
            if (nums[i] == 0) {
                //获取下标，所有元素前移，
                for (int start = i; start < end-1; start++) {
                    nums[start] = nums[start + 1];
                }
                nums[end-1] = 0;
                end--;
                i--;
            }
        }
    }


}
